package com.nf.sms.controller;

import com.nf.sms.dao.ProductDao;
import com.nf.sms.dao.impl.ProductDaoImpl;
import com.nf.sms.entity.Product;
import com.nf.sms.utils.PagerUtil;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.util.List;

/**
 * 单条件分页查询商品信息
 *
 * @author ZQX
 * @date 2024-10-10
 */
@WebServlet("/pager_cond.do")
public class PagerByCondServlet extends HttpServlet {

    /**
     * 常量 - 用于描述每页显示的记录数
     */
    private static final int PAGE_COUNT = 1;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");

        // 第一：获取页面传递（表单）的数据 - 验证数据的合法性（正则表达式）
        // 1.获取页面转递过来的当前页
        String strCp = req.getParameter("cp");
        String cond = req.getParameter("productName");
        cond = cond == null ? "" : cond;

        // 2.对当前页进行合法性验证 - 必须保证当前页为 1-N 的整数
        int cp = strCp != null && strCp.matches("\\d{1,}") ? Integer.parseInt(strCp) : 1;

        // 第二：加工处理 - 实现具体的业务逻辑
        // 1.实例化 Dao 对象
        ProductDao productDao = new ProductDaoImpl();
        long totalRecordCount = productDao.selectCount(cond);

        // 2.初步封装分页信息
        PagerUtil<Product> pagerUtil = new PagerUtil<>();
        pagerUtil.setPageCount(PAGE_COUNT);
        pagerUtil.setTotalRecordCount(totalRecordCount);
        pagerUtil.setCurrentPage(cp);

        // 3.查询当前页数据，进一步封装分页信息
        List<Product> list = productDao.selectByPage((int) pagerUtil.getCurrentPage(), PAGE_COUNT, cond);
        pagerUtil.setData(list);


        // 第三：响应 - 重定向或转发页面
        // 1.把数据存储到相应的作用域对象中
        req.setAttribute("pager", pagerUtil);

        // 2.跳转页面
        req.getRequestDispatcher("pages_by_cond.jsp").forward(req, resp);
    }
}
